X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=Editor.pas;h=96058ffc062f1a41bf80c14377826c9976bc6ddc;hb=refs%2Fheads%2Fmaster;hp=83d1194f6d16e6f26910dfb3aba8469b52280173;hpb=21b5adc39ba262c88c77bdc5dd129ceb4a08f579;p=gikonavigoeson%2Fgikonavi.git
diff --git a/Editor.pas b/Editor.pas
index 83d1194..96058ff 100644
--- a/Editor.pas
+++ b/Editor.pas
@@ -12,17 +12,17 @@ uses
SHDocVw_TLB,
MSHTML_TLB,
{$IFEND}
- ActiveX, {HTTPApp,} YofUtils, Trip, IniFiles, StrUtils,
+ ActiveX, {HTTPApp,} YofUtils, IniFiles, StrUtils,
GikoSystem, GikoUtil, ImgList, Clipbrd, BoardGroup,
IdAntiFreezeBase, IdAntiFreeze, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdHTTP, ActnList, StdActns, IdIntercept,
IdLogBase, IdLogDebug, IdException, DateUtils, bmRegExp,
- Gesture;
+ Gesture, AppEvnts, SambaTimer, IdCookieManager, WideMemo;
type
// TSetLayeredWindowAttributes = function(wnd: HWND; crKey: DWORD; bAlpha: BYTE; dwFlag: DWORD): Boolean; stdcall;
//«Ýßèl^Cv
- TGikoResultType = (grtOK, grtCookie, grtCheck, grtError);
+ TGikoResultType = (grtOK, grtCookie, grtCheck, grtError, grtNinpou, grtNinpouErr, grtSuiton);
TEditorForm = class(TForm)
MainMenu: TMainMenu;
@@ -44,7 +44,6 @@ type
N02: TMenuItem;
ToolBarImageList: TImageList;
HotToobarImageList: TImageList;
- BodyEdit: TMemo;
NameBasePanel: TPanel;
NameLabel: TLabel;
MailLabel: TLabel;
@@ -90,7 +89,6 @@ type
SelectAllAction: TAction;
N2: TMenuItem;
SelectAll1: TMenuItem;
- Timer1: TTimer;
QuotePasteAction: TAction;
QuotePasteMenuItem: TMenuItem;
C1: TMenuItem;
@@ -119,11 +117,32 @@ type
LocalEdit: TMemo;
N6: TMenuItem;
LocalRuleBrowse: TMenuItem;
- ToolButton4: TToolButton;
+ ToolButton4: TToolButton;
ToolButton6: TToolButton;
SaveNameMailAction: TAction;
ToolButton7: TToolButton;
BeLogInOutEAction: TAction;
+ UpdateSambaAction: TAction;
+ Samba241: TMenuItem;
+ N7: TMenuItem;
+ InputAssistAction: TAction;
+ InputAssistPopupMenu: TPopupMenu;
+ ApplicationEvents1: TApplicationEvents;
+ ToolButton8: TToolButton;
+ ToolButton9: TToolButton;
+ ShowInputAssistForm: TAction;
+ ReleaseCookieAction: TAction;
+ Cookie1: TMenuItem;
+ ContinueModeAction: TAction;
+ ToolButton10: TToolButton;
+ ToolButton11: TToolButton;
+ OpenSendTargetAction: TAction;
+ ReloadTargetAction: TAction;
+ N8: TMenuItem;
+ N9: TMenuItem;
+ N10: TMenuItem;
+ UCInfoPanel: TPanel;
+ BodyEdit: TMemo;
procedure EditorPageChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
@@ -158,7 +177,6 @@ type
AStream: TStream);
procedure SelectAllActionExecute(Sender: TObject);
procedure StatusBarResize(Sender: TObject);
- procedure Timer1Timer(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure QuotePasteActionExecute(Sender: TObject);
@@ -176,6 +194,19 @@ type
procedure SaveNameMailActionExecute(Sender: TObject);
procedure BeLogInOutEActionExecute(Sender: TObject);
procedure BeLogInOutEActionUpdate(Sender: TObject);
+ procedure UpdateSambaActionUpdate(Sender: TObject);
+ procedure UpdateSambaActionExecute(Sender: TObject);
+ procedure InputAssistActionExecute(Sender: TObject);
+ procedure ApplicationEvents1Message(var Msg: tagMSG;
+ var Handled: Boolean);
+ procedure ShowInputAssistFormExecute(Sender: TObject);
+ procedure ReleaseCookieActionExecute(Sender: TObject);
+ procedure GetSETTINGTXTActionUpdate(Sender: TObject);
+ procedure GetHeadTXTActionUpdate(Sender: TObject);
+ procedure ContinueModeActionExecute(Sender: TObject);
+ procedure ContinueModeActionUpdate(Sender: TObject);
+ procedure OpenSendTargetActionExecute(Sender: TObject);
+ procedure ReloadTargetActionExecute(Sender: TObject);
private
FThreadItem: TThreadItem;
FBoard: TBoard;
@@ -186,45 +217,22 @@ type
FStatusCode: Integer;
FDebugStrReceive: string;
FDebugStrSend: string;
- FSambaTime: TDateTime;
- FHost: string;
FNow: TDateTime;
- FGestures : TMouseGesture;
+ FInputAssistKey: String; ///< üÍAVXgÌL[
+ FResistWords: TStringList; ///< üÍAVXgÌ«©çÌõÊ
+ FSambaTimer: TSambaTimer; ///< SambaÎôÌ^C}[
+ FCookieDomain: string; ///< E@hC
+ FUseUC: Boolean;
+ BodyEditUC: TWideMemo;
procedure Preview;
- function RepHtml(s: string): string;
function Check: Boolean;
procedure SetNameList(sName, sMail: string);
-// procedure Send(SendType: TGikoSendType; SPID: string; PON: string; FirstWriting: Boolean);
-// procedure Send(SPID: string; PON: string; FirstWriting: Boolean);
- procedure Send(ACOOKIE: string; SPID: string; PON: string; FirstWriting: Boolean);
-
+ procedure Send(const ACOOKIE: string; const SPID: string; const PON: string; FirstWriting: Boolean);
function GetActiveControlHandle: THandle;
-// function GetSendData: string;
-// procedure GetSendData(Source: TStringStream);
procedure GetSendData(Source: TStringStream);
procedure SaveSendFile;
procedure SetContent(Content: string; ABrowser: TWebBrowser);
function GetResultType(ResponseText: string): TGikoResultType;
-
- procedure ReadSambaTime(const AHost: string); overload;
- procedure WriteSambaTime(const AHost: string; ATime: TDateTime); overload;
- function ReadSettingTime(const AHost: string): Integer; overload;
- function CheckSambaTime(const AHost: string; ATime: TDateTime): Boolean; overload;
- procedure SetSamba24(AURL: string); overload;
-
- //SambaÌÔðÇÝÞ
- procedure ReadSambaTime(); overload;
- //SambaÉÔð«Þ
- procedure WriteSambaTime(ATime: TDateTime); overload;
- //SambaÌÝèlðÇÝÞ
- function ReadSettingTime(): Integer ; overload;
- //SambaÉøÁ©©é©¸·é
- function CheckSambaTime(ATime: TDateTime): Boolean; overload;
- //SambaÌÝèlð«Þ
- procedure SetSamba24(); overload;
-
- /// øpÌæ¾
- function GetOEIndentChar : string;
/// {¶Ìæ¾
function GetBody : string;
//IdHttpÌú»
@@ -242,24 +250,62 @@ type
//HEAD.TXT©®\¦
procedure ShowBoardHead(ABoard: TBoard; AMemo: TMemo);
//LocalFusianaTrapAlart
- function LFusianaGet(s: String): Boolean;
+ function LFusianaGet(const s: String): Boolean;
// CookieÌæ¾
- procedure GetCookie(Rawtext: String; ABoard: TBoard);
+ procedure GetCookie(CookieMng: TIdCookieManager; ABoard: TBoard);
+ // hiddenf[^æ¾
+ procedure GetHiddenParameter(Rawtext: String; ABoard: TBoard);
+ //! üÍAVXgÌ|bvAbvj
[ÌNbNCxg
+ procedure InputAssistMenuClick(Sender: TObject);
+ //! TMemoÌJ[\Êuɶñ}ü
+ procedure InsertText(Memo: TMemo; Text: String);
+ //! M~
+ procedure CancelSend(ABoard: TBoard; ASysMenu: HMENU);
+ //! Samba^C}[Cxg
+ procedure SambaTimer(Sender: TObject);
+ //! EBhEÌÊuÆTCYÌÝè
+ procedure SetWindowRect;
+ //! g£^uÝè
+ procedure SetExtraTab;
+ //! Âæ¾
+ function GetBoard : TBoard;
+ //! URLÌf[^ðstreamÉæèÞ
+ procedure GetWebData(const URL: string; const RefURL: string;
+ Modified: TDateTime; stream: TStream);
+ //! GikoFormÉV
bZ[WðÇÁ·é
+ procedure AddFormMessageNew(icon: TGikoMessageIcon);
+ //! [Jfusianagbv
+ function isLocalFusianaTrap: Boolean;
+ //! [Jfusianagbv
+ function isRemoteFusianaTrap: Boolean;
+ //! Header¶ñæ¾
+ function getHeaderStr(const ACOOKIE: string; const SPID : string;
+ const PON : string; const HAP : string; Board : TBoard) : string;
+ //! fusianax_CAO
+ function FusianaMsgBox: Integer;
+ //! sent.init@C̶¬
+ function CreateSentIniFile: TMemIniFile;
+ //! ë`FbN
+ function isGobaku: Boolean;
protected
procedure CreateParams(var Params: TCreateParams); override;
public
- FBBSID: String;
+ FBBSID: String;
procedure SetFont;
procedure SetThreadItem(Item: TThreadItem);
procedure SetBoard(Item: TBoard);
- property BBSID: string read FBBSID write FBBSID;
-
+ procedure UpdateSambaStatus;
+ procedure SetFocusEdit;
+ procedure SetTextEdit(TextSrc: String);
+ property BBSID: string read FBBSID write FBBSID;
end;
implementation
uses
- Giko, ItemDownload, MojuUtils, IdGlobal, GikoMessage;
+ Giko, ItemDownload, MojuUtils, IdGlobal, GikoMessage, Imm,
+ InputAssistDataModule, InputAssist, HTMLCreate, IdCookie, GikoDataModule,
+ Belib;
const
CAPTION_NAME_NEW: string = 'MRir X§ÄGfB^';
CAPTION_NAME_RES: string = 'MRir XGfB^';
@@ -285,17 +331,6 @@ const
RES2CH_CHECK = '';
RES2CH_COOKIE = '';
-
- BBS2CH_NAME: string = 'Q¿áñËé';
- BBS2CH_LOG_FOLDER: string = '2ch';
- EXTERNAL_LOG_FOLDER: string = 'exboard';
-
- FOLDER_INI_FILENAME: string = 'Folder.ini';
- FOLDER_INDEX_FILENAME: string = 'Folder.idx';
- SUBJECT_FILENAME: string = 'subject.txt';
- PATH_DELIM: string = '\';
-
-
type
TSelection = record
StartPos, EndPos: Integer;
@@ -325,50 +360,36 @@ begin
end;}
procedure TEditorForm.FormCreate(Sender: TObject);
-var
- wp: TWindowPlacement;
- hUser32 : HINST;
- ini: TIniFile;
begin
+ FUseUC := GikoSys.Setting.UseUnicode;
+
+ BodyEditUC := TWideMemo.Create(Self);
+ BodyEditUC.Parent := EditorTab;
+ BodyEditUC.Align := alClient;
+ BodyEditUC.ScrollBars := ssBoth;
+
+ if (FUseUC = True) then begin
+ BodyEditUC.Visible := True;
+ BodyEdit.Visible := False;
+ EditorTab.Caption := EditorTab.Caption + '(Unicode[h)';
+ end else begin
+ BodyEditUC.Visible := False;
+ BodyEdit.Visible := True;
+ EditorTab.Caption := EditorTab.Caption + '(Shift-JIS[h)';
+ end;
+
FWork := False;
+ FSambaTimer := TSambaTimer.Create(Self);
+ FSambaTimer.Interval := 0;
Browser.Navigate('about:blank');
TitlePictureBrowser.Navigate('about:blank');
+ WebBrowser1.Navigate('about:blank');
FBoard := nil;
FThreadItem := nil;
- //EBhEÌÊuÝè
- wp.length := sizeof(wp);
- wp.rcNormalPosition.Top := GikoSys.Setting.EditWindowTop;
- wp.rcNormalPosition.Left := GikoSys.Setting.EditWindowLeft;
-
- wp.rcNormalPosition.Bottom := GikoSys.Setting.EditWindowTop + GikoSys.Setting.EditWindowHeight;
- wp.rcNormalPosition.Right := GikoSys.Setting.EditWindowLeft + GikoSys.Setting.EditWindowWidth;
- wp.showCmd := SW_HIDE;
- SetWindowPlacement(Handle, @wp);
-
- if GikoSys.Setting.EditWindowMax then
- WindowState := wsMaximized;
-
- //EBhEªæÊOÈçæÊàÉÚ®·é
- if (Left + Width) > Screen.Width then
-// Left := Screen.Width - Width;
- Left := 0;
- if (Top + Height) > Screen.Height then
-// Top := Screen.Height - Height;
- Top := 0;
- if Left < 0 then
- Left := 0;
- if Top < 0 then
- Top := 0;
-
- //»ÝÌEBhEÌÊuðÛ¶
- GikoSys.Setting.EditWindowTop := Top + WINDOWMOVE_V; // ÉJEBhEÍ
- GikoSys.Setting.EditWindowLeft := Left + WINDOWMOVE_H; // @@@EÎߺɸç·
- //EBhEÌƳª¬³·¬¢êγÉß·
- if GikoSys.Setting.EditWindowHeight < 144 then
- Height := 400;
- if GikoSys.Setting.EditWindowWidth < 144 then
- Width := 640;
+ if (Owner <> nil) and (Owner.ClassNameIs('TKeySettingForm') = False) then
+ //EBhEÌÊuÝè
+ SetWindowRect;
EditorPage.ActivePage := EditorTab;
FNameComboEdit := GetWindow(NameComboBox.Handle, GW_CHILD);
@@ -376,20 +397,8 @@ begin
NameComboBox.Items.Assign(GikoSys.Setting.NameList);
MailComboBox.Items.Assign(GikoSys.Setting.MailList);
SetFont;
- hUser32 := 0;
- try
- try
- hUser32 := LoadLibrary('User32.dll');
- if hUser32 <> 0 then
- TransAction.Enabled := true
- else
- TransAction.Enabled := false;
- except
- TransAction.Enabled := false;
- end;
- finally
- FreeLibrary(hUser32);
- end;
+ // ¼§¾pÂ\Ýè
+ TransAction.Enabled := GikoSys.CanUser32DLL;
// EBhEÌXeCóÔ
if GikoSys.Setting.EditWindowStay then begin // XeCóÔ
@@ -417,34 +426,13 @@ begin
SpaceToNBSPAction.Checked := GikoSys.Setting.SpaceToNBSP;
AmpToCharRefAction.Checked := GikoSys.Setting.AmpToCharRef;
+ // [J[{ÂgbvæÌ^uÌÝè
+ SetExtraTab;
- ini := TIniFile.Create(GikoSys.Setting.GetFileName);
-
- try
- BoardtopTab.TabVisible := ini.Readbool('EditorForm', 'BoardTopTab', False);
- BoardTop.Checked := BoardtopTab.TabVisible;
- RocalRuleTab.TabVisible := ini.ReadBool('EditorForm', 'LocalRuleTab', False);
- LocalRule.Checked := RocalRuleTab.TabVisible;
- finally
- ini.Free;
- end;
-
- // }EXWFX`[ÌCXg[
- if GikoSys.Setting.GestureEnabled then begin
- MouseGesture.UnHook;
- FGestures := TMouseGesture.Create;
- GikoSys.Setting.Gestures.ClearGesture;
-
- GikoSys.Setting.Gestures.LoadGesture(
- GikoSys.Setting.GetGestureFileName, ActionList );
- MouseGesture.OnGestureStart := OnGestureStart;
- MouseGesture.OnGestureMove := OnGestureMove;
- MouseGesture.OnGestureEnd := OnGestureEnd;
- MouseGesture.SetHook( Handle );
- end;
+ // L[ÝèÌÇÝÝ
+ GikoSys.LoadKeySetting(ActionList, GikoSys.GetEditorKeyFileName);
SaveNameMailAction.Checked := True;
end;
-
procedure TEditorForm.SetBoard(Item: TBoard);
begin
FBoard := Item;
@@ -453,7 +441,13 @@ begin
MailComboBox.Text := FBoard.KotehanMail;
SageCheckBox.Checked := AnsiPos('sage', MailComboBox.Text) <> 0;
TitlePanel.Visible := True;
- SetSamba24(FBoard.URL);
+
+ if (FSambaTimer.SetBoard(FBoard) >= 0) then begin
+ UpdateSambaStatus;
+ FNow := Now();
+ FSambaTimer.OnTimer := SambaTimer;
+ end;
+
ShowBoardInformation(FBoard, BoardInformationMemo);
ShowTitlePicture();
end;
@@ -466,7 +460,13 @@ begin
MailComboBox.Text := FThreadItem.ParentBoard.KotehanMail;
SageCheckBox.Checked := AnsiPos('sage', MailComboBox.Text) <> 0;
TitlePanel.Visible := False;
- SetSamba24(FThreadItem.ParentBoard.URL);
+
+ if (FSambaTimer.SetBoard(FThreadItem.ParentBoard) >= 0) then begin
+ UpdateSambaStatus;
+ FNow := Now();
+ FSambaTimer.OnTimer := SambaTimer;
+ end;
+
ShowBoardInformation(FThreadItem.ParentBoard, BoardInformationMemo);
ShowTitlePicture();
end;
@@ -480,7 +480,11 @@ const
TAB_LENGTH = 4;
begin
- body := BodyEdit.Text;
+ if (FUseUC = True) then
+ body := BodyEditUC.EncodeText
+ else
+ body := BodyEdit.Text;
+
if AmpToCharRefAction.Checked then
// & Ìu·ÍêÔÅÉâé±Æ
body := CustomStringReplace( body, '&', '&' );
@@ -552,10 +556,17 @@ end;
procedure TEditorForm.SetFont;
begin
- BodyEdit.Font.Name := GikoSys.Setting.EditorFontName;
- BodyEdit.Font.Size := GikoSys.Setting.EditorFontSize;
- BodyEdit.Font.Color := GikoSys.Setting.EditorFontColor;
- BodyEdit.Color := GikoSys.Setting.EditorBackColor;
+ if (FUseUC = True) then begin
+ BodyEditUC.Font.Name := GikoSys.Setting.EditorFontName;
+ BodyEditUC.Font.Size := GikoSys.Setting.EditorFontSize;
+ BodyEditUC.Font.Color := GikoSys.Setting.EditorFontColor;
+ BodyEditUC.Color := GikoSys.Setting.EditorBackColor;
+ end else begin
+ BodyEdit.Font.Name := GikoSys.Setting.EditorFontName;
+ BodyEdit.Font.Size := GikoSys.Setting.EditorFontSize;
+ BodyEdit.Font.Color := GikoSys.Setting.EditorFontColor;
+ BodyEdit.Color := GikoSys.Setting.EditorBackColor;
+ end;
end;
procedure TEditorForm.Preview;
@@ -564,73 +575,38 @@ var
No: string;
Mail: string;
Namae: string;
- DateTime: string;
Body: string;
s: string;
-
- posTrip : Integer;
- tripOrigin : string;
begin
if FThreadItem = nil then begin
No := '1';
- Title := RepHtml(TitleEdit.Text);
+ Title := THTMLCreate.RepHtml(TitleEdit.Text);
end else begin
No := IntToStr(FThreadItem.Count + 1);
- Title := RepHtml(FThreadItem.Title);
+ Title := THTMLCreate.RepHtml(FThreadItem.Title);
end;
- body := GetBody;
- Namae := RepHtml(NameComboBox.Text);
- Mail := RepHtml(MailComboBox.Text);
- Body := RepHtml(body);
- Body := StringReplace(Body, #13#10, '
', [rfReplaceAll]);
- DateTime := FormatDateTime('yyyy/mm/dd(aaa) hh:nn', now);
+ Body := GetBody;
+ Namae := THTMLCreate.RepHtml(NameComboBox.Text);
+ Mail := THTMLCreate.RepHtml(MailComboBox.Text);
+ Body := THTMLCreate.RepHtml(Body);
+ Body := CustomStringReplace(Body, #13#10, '
', False);
+
if Trim(Namae) = '' then
Namae := '¼³µ³ñ';
- s := '
'; ResponseText := ResponseText + '±±©çMRirÌîñ'#13#10; + ResponseText := ResponseText + #13#10'áO'#13#10; + ResponseText := ResponseText + ExpMsg; ResponseText := ResponseText + #13#10'M'#13#10; ResponseText := ResponseText + FDebugStrSend; ResponseText := ResponseText + #13#10'óM'#13#10; @@ -1087,53 +1022,61 @@ begin finally Source.Free; TextStream.Free; + if ( Indy.CookieManager <> nil ) then begin + Indy.CookieManager.CookieCollection.Clear; + end; //sysMenu := GetSystemMenu( Handle, true ); EnableMenuItem(SysMenu, SC_CLOSE, MF_BYCOMMAND or MF_ENABLED); DrawMenuBar(Handle); end; FWork := false; - //ñö®MRirÂÈÇÌXNvgp - //ResponceCodeª302FoundÅ«Ý®¹ + //ñö®MRirÂÈÇÌ2chÝ·XNvgp + //2chÈOÅ©ÂResponceCodeª302FoundÅ«Ý®¹ + //if (not Board.Is2ch) and (FStatusCode = 302) then begin if FStatusCode = 302 then begin GikoForm.PlaySound('ResEnd'); SaveSendFile; - if FThreadItem = nil then - GikoForm.AddMessageList(FBoard.Title + ' ' + GikoSys.GetGikoMessage(gmNewSure), nil, gmiOK) - else - GikoForm.AddMessageList(FThreadItem.Title + ' ' + GikoSys.GetGikoMessage(gmNewRes), nil, gmiOK); - Close; - Exit; + AddFormMessageNew( gmiOK ); + if (not ContinueModeAction.Enabled) or (not ContinueModeAction.Checked) then begin + Close; + Exit; + end; end; if State = gdsComplete then begin GikoForm.PlaySound('ResEnd'); SaveSendFile; - if FThreadItem = nil then - GikoForm.AddMessageList(FBoard.Title + ' ' + GikoSys.GetGikoMessage(gmNewSure), nil, gmiOK) - else - GikoForm.AddMessageList(FThreadItem.Title + ' ' + GikoSys.GetGikoMessage(gmNewRes), nil, gmiOK); - Close; + AddFormMessageNew( gmiOK ); + if (not ContinueModeAction.Enabled) or (not ContinueModeAction.Checked) then begin + Close; + end; end else if State = gdsError then begin - if FThreadItem = nil then - GikoForm.AddMessageList(FBoard.Title + ' ' + GikoSys.GetGikoMessage(gmNewSure), nil, gmiOK) - else - GikoForm.AddMessageList(FThreadItem.Title + ' ' + GikoSys.GetGikoMessage(gmNewRes), nil, gmiOK); - + AddFormMessageNew( gmiOK ); EditorPage.ActivePage := PreviewTab; SetContent(ResponseText, Browser); end else if State = gdsAbort then begin GikoForm.AddMessageList(FThreadItem.Title + ' ' + GikoSys.GetGikoMessage(gmAbort), nil, gmiSAD); end; end; - function TEditorForm.GetResultType(ResponseText: string): TGikoResultType; begin if AnsiPos('«±ÝªIíèܵ½', ResponseText) <> 0 then Result := grtOK - else if (AnsiPos('NbL[ªÈ¢©úÀØêÅ·', ResponseText) > 0) or + else if ( (AnsiPos('椱»FMûÌE@ð쬵ܷBQªãÉÄx«Þ©A¨Aè¾³¢', ResponseText) > 0) or + (AnsiPos('dqqnqFMûÌ`¯Ìðì¬Å·', ResponseText) > 0) ) + and (AnsiPos(RES2CH_COOKIE, ResponseText) > 0) then + Result := grtNinpou + else if ( (AnsiPos('dqqnqFCsª«èܹñ', ResponseText) > 0) or // G[µ¢ + (AnsiPos('dqqnqFLvª«èÈÄXbh§Ä', ResponseText) > 0) ) // G[µ¢ + and (AnsiPos(RES2CH_COOKIE, ResponseText) > 0) then + Result := grtNinpouErr + else if( AnsiPos('âçê½Å²´éFLv=0
³Ä©ÍÅÅ«é©È?', ResponseText) > 0) + and (AnsiPos(RES2CH_COOKIE, ResponseText) > 0) then + Result := grtSuiton + else if ( AnsiPos('NbL[ªÈ¢©úÀØêÅ·', ResponseText) > 0) or (AnsiPos('NbL[mFI ', ResponseText) > 0) or - (AnsiPos('¡NbL[mFI¡ ', ResponseText) > 0) or - //(AnsiPos('NbL[mF', ResponseText) > 0) or - (AnsiPos(RES2CH_COOKIE, ResponseText) > 0) then + (AnsiPos('¡NbL[mFI¡ ', ResponseText) > 0) or + (AnsiPos('(cookieðÝè·éƱÌæÊÍÅÈÈèÜ·B)', ResponseText) > 0) or + (AnsiPos(RES2CH_COOKIE, ResponseText) > 0) then Result := grtCookie else if (AnsiPos('«Ý`FbNI ', ResponseText) > 0) or (AnsiPos('¡ «ÝmFµÜ· ¡ ', ResponseText) > 0) or @@ -1145,8 +1088,8 @@ begin else if (AnsiPos('EeÒÍAf¦Â^cÒÉεÄAìÒli ðêØsgµÈ¢±Æð³øµÜ·B
', ResponseText) > 0) or (AnsiPos('iì @æ21ðÈ¢µæ28ðÉKè³êé àÜÞj»Ì¼Ì É«A', ResponseText) > 0) then Result := grtCookie - else - Result := grtError; + else + Result := grtError; end; @@ -1159,10 +1102,7 @@ var Board: TBoard; body : string; begin - if FThreadItem = nil then - Board := FBoard - else - Board := FThreadItem.ParentBoard; + Board := GetBoard; if GikoSys.Setting.UseMachineTime then begin if GikoSys.Setting.TimeAdjust then @@ -1184,12 +1124,13 @@ begin s := 'sid=' + HttpEncode(SessionID) + '&' else s := ''; - s := s + 'subject=&' - + 'FROM=' + HttpEncode(NameComboBox.Text) + '&' - + 'mail=' + HttpEncode(MailComboBox.Text) + '&' - + 'MESSAGE=' + HttpEncode(body) + '&' - + 'bbs=' + Board.BBSID + '&' - + 'time=' + IntToStr(SendTime) + '&'; + s := s + 'subject=&' + + 'FROM=' + HttpEncode(NameComboBox.Text) + '&' + + 'mail=' + HttpEncode(MailComboBox.Text) + '&' + + 'MESSAGE=' + HttpEncode(body) + '&' + + 'bbs=' + Board.BBSID + '&' + + 'time=' + IntToStr(SendTime) + '&'; + if FThreadItem = nil then begin s := s + 'subject=' + HttpEncode(TitleEdit.Text) + '&'; s := s + 'submit=' + HttpEncode('SÓCð¤±Æð³øµÄ«Þ') + #13#10; @@ -1204,33 +1145,69 @@ procedure TEditorForm.SaveSendFile; var sDate: string; ini: TMemIniFile; -begin - ini := TMemIniFile.Create(GikoSys.GetSentFileName); - try - sDate := IntToStr(GikoSys.DateTimeToInt(Now)); - - ini.WriteString(sDate, 'Name', NameComboBox.Text); - ini.WriteString(sDate, 'EMail', MailComboBox.Text); - ini.WriteString(sDate, 'Body', HttpEncode(BodyEdit.Text)); - ini.WriteInteger(sDate, 'Status', FStatusCode); - ini.WriteDateTime(sDate, 'Date', Now); - if FThreadItem = nil then begin - ini.WriteString(sDate, 'Title', TitleEdit.Text); - ini.WriteString(sDate, 'BBS', FBoard.BBSID); - ini.WriteInteger(sDate, 'NewThread', 1); - end else begin - ini.WriteString(sDate, 'Title', FThreadItem.Title); - ini.WriteString(sDate, 'BBS', FThreadItem.ParentBoard.BBSID); - ini.WriteString(sDate, 'Key', ChangeFileExt(FThreadItem.FileName, '')); - end; - - ini.UpdateFile; - finally - ini.Free; - end; + Body: String; +begin + ini := CreateSentIniFile; + if (ini <> nil) then begin + try + sDate := IntToStr(GikoSys.DateTimeToInt(Now)); + if (FUseUC = True) then + Body := BodyEditUC.EncodeText + else + Body := BodyEdit.Text; + + ini.WriteString(sDate, 'Name', NameComboBox.Text); + ini.WriteString(sDate, 'EMail', MailComboBox.Text); + ini.WriteString(sDate, 'Body', HttpEncode(Body)); + ini.WriteInteger(sDate, 'Status', FStatusCode); + ini.WriteDateTime(sDate, 'Date', Now); + if FThreadItem = nil then begin + ini.WriteString(sDate, 'Title', MojuUtils.Sanitize(TitleEdit.Text)); + //ini.WriteString(sDate, 'BBS', FBoard.BBSID); + ini.WriteString(sDate, 'URL', FBoard.URL); + ini.WriteInteger(sDate, 'NewThread', 1); + end else begin + ini.WriteString(sDate, 'Title', FThreadItem.Title); + //ini.WriteString(sDate, 'BBS', FThreadItem.ParentBoard.BBSID); + ini.WriteString(sDate, 'URL', FThreadItem.URL); + ini.WriteString(sDate, 'Key', ChangeFileExt(FThreadItem.FileName, '')); + end; + + ini.UpdateFile; + finally + ini.Free; + end; + end; +end; +function TEditorForm.CreateSentIniFile: TMemIniFile; +var + maxSize, fileSize, i: Integer; + newName: String; +begin + Result := nil; + // MB -> bytes + maxSize := GikoSys.Setting.SentIniFileSize * 1024 * 1024; + // t@CTCYª0ÌêÍAsent.iniÉ«ÜÈ¢ÌÅnilðÔ· + if (maxSize > 0) then begin + fileSize := GikoSys.GetFileSize(GikoSys.Setting.GetSentFileName); + // ÅåTCYð´¦Ä¢½êÍl[·é + if (fileSize >= maxSize) then begin + i := 0; + // ¡Ìðt@C¼Ìãëɯé + repeat + // 10ñÈã¸sµ½ç «çßé + if (i > 10) then break; + DateTimeToString(newName, 'yyhhnnsszzz', Now()); + Inc(i); + until RenameFile(GikoSys.Setting.GetSentFileName, + GikoSys.Setting.GetSentFileName + '.' + newName); + end; + Result := TMemIniFile.Create(GikoSys.Setting.GetSentFileName); + end; end; - procedure TEditorForm.SendActionExecute(Sender: TObject); +const + TITLE_SAMBA : string = 'Samba24x'; var Board: TBoard; rc: Integer; @@ -1246,10 +1223,7 @@ begin Application.ProcessMessages; if not Check then Exit; - if FThreadItem = nil then - Board := FBoard - else - Board := FThreadItem.ParentBoard; + Board := GetBoard; if FThreadItem = nil then begin rc := GikoUtil.MsgBox(Handle, @@ -1282,7 +1256,8 @@ begin SaveSendFile; GikoForm.AddMessageList(FBoard.Title + ' ' + GikoSys.GetGikoMessage(gmNewSure), nil, gmiOK); FWork := False; - Close; + if (not ContinueModeAction.Enabled) or (not ContinueModeAction.Checked) then + Close; end else if State = gdsError then begin GikoForm.AddMessageList(FBoard.Title + ' ' + GikoSys.GetGikoMessage(gmSureError), nil, gmiNG); end else if State = gdsAbort then begin @@ -1298,7 +1273,8 @@ begin SaveSendFile; GikoForm.AddMessageList(FThreadItem.Title + ' ' + GikoSys.GetGikoMessage(gmNewRes), nil, gmiOK); FWork := False; - Close; + if (not ContinueModeAction.Enabled) or (not ContinueModeAction.Checked) then + Close; end else if State = gdsError then begin GikoForm.AddMessageList(FThreadItem.Title + ' ' + GikoSys.GetGikoMessage(gmResError), nil, gmiOK); end else if State = gdsAbort then begin @@ -1306,19 +1282,23 @@ begin end; end; end else begin - if not Timer1.Enabled then begin + if not FSambaTimer.Enabled then begin if CompareDateTime(Board.Expires ,Now) <= 0 then begin Board.Cookie := ''; Board.SPID := ''; Board.PON := ''; end; + // `¯ÌxßéâèÎ + if (Board.Is2ch) and (AnsiPos('HAP=', Board.Cookie)>0) then begin + Board.Cookie := ''; + end; Send(Board.Cookie, Board.SPID, Board.PON, True); end else begin - if not CheckSambaTime(FHost, Now()) then begin + if not FSambaTimer.CheckSambaTime(Now()) then begin rc := GikoUtil.MsgBox(Handle, 'Samba24ÌKèl¢Ìbµ©oߵĢܹñB'#13#10 + 'Mð~µÜ·©H' + #13#10 - + '(u¢¢¦v¾ÆMµÜ·)', 'Samba24x', + + '(u¢¢¦v¾ÆMµÜ·)', TITLE_SAMBA, MB_YESNO or MB_ICONQUESTION); if rc = IDYES then begin FWork := false; @@ -1327,7 +1307,7 @@ begin if rc = IDNO then begin rc2 := GikoUtil.MsgBox(Handle, '{ÉMµÜ·©H', - 'Sumba24x', + TITLE_SAMBA, MB_YESNO or MB_ICONQUESTION); if rc2 = IDNO then begin FWork := False; @@ -1340,13 +1320,18 @@ begin Board.SPID := ''; Board.PON := ''; end; + // `¯ÌxßéâèÎ + if (Board.Is2ch) and (AnsiPos('HAP=', Board.Cookie)>0) then begin + Board.Cookie := ''; + end; Send(Board.Cookie, Board.SPID, Board.PON, True); end; end; finally FWork := False; - if Timer1.Enabled then - ReadSambaTime(FHost); + if FSambaTimer.Enabled then begin + FNow := FSambaTimer.Update; + end; end; end; @@ -1529,83 +1514,13 @@ begin end; -procedure TEditorForm.Timer1Timer(Sender: TObject); -begin - if FSambaTime = ZERO_DATE then - StatusBar.Panels[1].Text := '' - else begin - FNow := IncMilliSecond(FNow, 500); - StatusBar.Panels[1].Text := Format('%8.0fboß', [SecondSpan(FNow, FSambaTime)]); - end; - -end; -//Samba.iniÌ«ÝÔðÇÝÞ -procedure TEditorForm.ReadSambaTime(const AHost: string); -var - ini :TMemIniFile; - tmp: string; -begin - Timer1.Enabled := false; //oßb\¦TimerðOffÉ·éi±êªONÌÆ«Samba24ÎôOnj - ini := TMemIniFile.Create(GikoSys.GetSambaFileName); - try - //¶ñÅÇÝæÁÄAÏ·ÖÅTDateTimeÖ - tmp := ini.ReadString('Send', AHost, DateTimeToStr(ZERO_DATE)); - FSambaTime := ConvertDateTimeString(tmp); - finally - ini.Free; - end; - FNow := Now(); //»ÝÔðæ¾iTimer\¦pÅACheck·éÆ«ÍÄÑNow()ðÄÔj - Timer1.Enabled := true; //oßb\¦TimerðOnÉ·éi±êªONÌÆ«Samba24ÎôOnj -end; -//Samba.iniÉÅI«ÝÔð«Þ -procedure TEditorForm.WriteSambaTime(const AHost: string; ATime: TDateTime); -var - ini :TMemIniFile; -begin - ini := TMemIniFile.Create(GikoSys.GetSambaFileName); - try - ini.WriteDateTime('Send', AHost, ATime); - ini.UpdateFile; - finally - ini.Free; - end; -end; -//ÅI«ÝÔÆ»Ýðär·éi^FKèlÈã@UFKèl¢j -function TEditorForm.CheckSambaTime(const AHost: string; ATime: TDateTime): Boolean; -var - pastsec: double; - SettingTime: Integer; -begin - SettingTime := ReadSettingTime(AHost); - ReadSambaTime(AHost); - pastsec := SecondSpan(ATime, FSambaTime); - if pastsec > SettingTime then - Result := true - else - Result := false; -end; -//AHostiI¼jÌSambaÌKèlðÇÝÞ -function TEditorForm.ReadSettingTime(const AHost: string): Integer; -var - ini :TMemIniFile; -begin - ini := TMemIniFile.Create(GikoSys.GetSambaFileName); - try - Result := ini.ReadInteger('Setting', AHost, 0); - //KèlªOÌÆ«AàµÍÝè³êĢȢƫÍAt@CÉ«½·B - if Result = 0 then begin - ini.WriteInteger('Setting', AHost, 0); - ini.UpdateFile; - end; - finally - ini.Free; - end; -end; //FormªActiveÉÈÁ½çÅI«ÝÔðÇÝÞ procedure TEditorForm.FormActivate(Sender: TObject); begin - if ( Timer1.Enabled ) and ( FThreadItem <> nil )then - ReadSambaTime(FHost); + if ( FSambaTimer.Enabled ) and ( FThreadItem <> nil ) then + begin + FNow := FSambaTimer.Update; + end; if GikoSys.Setting.GestureEnabled then begin GikoSys.Setting.Gestures.ClearGesture; GikoSys.Setting.Gestures.LoadGesture( @@ -1617,64 +1532,12 @@ begin MouseGesture.SetHook( Handle ); end; end; -//Samba24Îôðg¤©Ç¤©ßéÖ -//ReadSambaTime ðÄÑo·ÆTimerªOnÉÈé -procedure TEditorForm.SetSamba24(AURL: string); -var - Protocol, Host, Path, Document, Port, Bookmark : string; -begin - //Samba24ÎôðµÈ¢ÈçI¹ - if not GikoSys.Setting.UseSamba then - Exit; - //HostÌURLÉ'.2ch.'©'.bbspink.'ªÜÜêÄ¢½çSamba24Îôð·é - GikoSys.ParseURI( AURL, Protocol,Host, Path, Document, Port, Bookmark ); - if GikoSys.Is2chHost(Host) then begin - Host := Copy(Host, 1, AnsiPos('.', Host) - 1); - FHost := Host; //FHost=I¼ - ReadSambaTime(FHost); //ÈOÌ«ÝÔðÇÝÞ - //StatusBarɱÌIÌKèlð\¦·é - StatusBar.Panels[2].Text := 'Samba24Kèl' + IntToStr(ReadSettingTime(FHost)); - end; -end; procedure TEditorForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose := not FWork; end; -function TEditorForm.GetOEIndentChar : string; -var - regKey : TRegistry; - Identities : string; - IndentChar : DWORD; -const - DEFAULT_CHAR = '> '; - OE_MAIL_PATH = '\Software\Microsoft\Outlook Express\5.0\Mail'; - INDENT_CHAR = 'Indent Char'; -begin - - Result := DEFAULT_CHAR; - regKey := TRegistry.Create; - try - try - regKey.RootKey := HKEY_CURRENT_USER; - if not regKey.OpenKey( 'Identities', False ) then - Exit; - Identities := regKey.ReadString( 'Default User ID' ); - if Identities = '' then - Exit; - if not regKey.OpenKey( Identities + OE_MAIL_PATH, False ) then - Exit; - IndentChar := regKey.ReadInteger( INDENT_CHAR ); - Result := Char( IndentChar ) + ' '; - except - end; - finally - regKey.Free; - end; - -end; - procedure TEditorForm.QuotePasteActionExecute(Sender: TObject); var s : TStringList; @@ -1682,19 +1545,23 @@ var quote : string; begin - quote := GetOEIndentChar; - s := TStringList.Create; - try - s.Text := Clipboard.AsText; + quote := GikoSys.GetOEIndentChar; - for i := s.Count - 1 downto 0 do - s[ i ] := quote + s[ i ]; + if (FUseUC = True) then begin + BodyEditUC.QuotePaste(quote); + end else begin + s := TStringList.Create; + try + s.Text := Clipboard.AsText; - BodyEdit.SelText := s.Text; - finally - s.Free; - end; + for i := s.Count - 1 downto 0 do + s[ i ] := quote + s[ i ]; + BodyEdit.SelText := s.Text; + finally + s.Free; + end; + end; end; procedure TEditorForm.SpaceToNBSPActionExecute(Sender: TObject); @@ -1713,12 +1580,13 @@ end; procedure TEditorForm.BoardTopClick(Sender: TObject); var - ini: TIniFile; + ini: TMemIniFile; begin - ini := TIniFile.Create(GikoSys.Setting.GetFileName); + ini := TMemIniFile.Create(GikoSys.Setting.GetFileName); try BoardtopTab.TabVisible := BoardTop.Checked; ini.WriteBool('EditorForm', 'BoardTopTab', BoardtopTab.TabVisible); + ini.UpdateFile; finally ini.Free; end; @@ -1727,70 +1595,67 @@ end; procedure TEditorForm.GetSETTINGTXTActionExecute(Sender: TObject); var + memStream: TMemoryStream; URL, RefURL: string; settingBody: TStringList; tmpBoard: TBoard; begin - if FWork then - Exit; - FWork := True; - - InitIdHTTP(Indy); - if FThreadItem = nil then - tmpBoard := FBoard - else - tmpBoard := FThreadItem.ParentBoard; - - if tmpBoard = nil then Exit; - - RefURL := tmpBoard.URL; - if RefURL[Length(RefURL)] <> '/' then - URL := RefURL + '/' + 'SETTING.TXT' - else - URL := RefURL + 'SETTING.TXT'; - - Indy.Request.LastModified := tmpBoard.SETTINGTXTTime; - Indy.Request.Referer := RefURL; - Screen.Cursor := crHourGlass; - settingBody := TStringList.Create; - try - StatusBar.Panels[0].Text := 'SETTING.TXT_E[h'; - try - IdAntiFreeze.Active := True; - try - settingBody.Text := Indy.Get(URL); - finally - IdAntiFreeze.Active := False; - end; - if( Indy.ResponseCode = 200 ) then begin - settingBody.SaveToFile(tmpBoard.GetSETTINGTXTFileName); - tmpBoard.SETTINGTXTTime := Indy.Response.LastModified; - tmpBoard.IsSETTINGTXT := true; - tmpBoard.TitlePictureURL := GetTitlePictureURL(settingBody, tmpBoard); - tmpBoard.Modified := true; - StatusBar.Panels[0].Text := 'SETTING.TXTæ¾®¹(' + IntToStr(Indy.ResponseCode) + ')'; - end; - except - on E: EIdException do begin - if( AnsiPos('304', E.Message) > 0 ) then - StatusBar.Panels[0].Text := 'SETTING.TXTXV³µ(' + IntToStr(Indy.ResponseCode) + ')' - else - StatusBar.Panels[0].Text := 'SETTING.TXTæ¾G[(' + IntToStr(Indy.ResponseCode) + ')'; - end; - end; - finally - settingBody.Free; - Screen.Cursor := crDefault; - end; - ShowBoardInformation(tmpBoard, BoardInformationMemo); - + if not FWork then begin + FWork := True; + + tmpBoard := GetBoard; + if tmpBoard <> nil then begin + + RefURL := tmpBoard.URL; + if RefURL[Length(RefURL)] <> '/' then + URL := RefURL + '/' + 'SETTING.TXT' + else + URL := RefURL + 'SETTING.TXT'; + Screen.Cursor := crHourGlass; + memStream := TMemoryStream.Create; + try + try + StatusBar.Panels[0].Text := 'SETTING.TXT_E[h'; + GetWebData(URL, RefURL, tmpBoard.SETTINGTXTTime, memStream); + if( Indy.ResponseCode = 200 ) then begin + settingBody := TStringList.Create; + try + memStream.Seek(0, soFromBeginning); + settingBody.LoadFromStream(memStream); + settingBody.SaveToFile(tmpBoard.GetSETTINGTXTFileName); + tmpBoard.SETTINGTXTTime := Indy.Response.LastModified; + tmpBoard.IsSETTINGTXT := true; + tmpBoard.TitlePictureURL := GetTitlePictureURL(settingBody, tmpBoard); + tmpBoard.Modified := true; + finally + settingBody.Free; + end; + StatusBar.Panels[0].Text := 'SETTING.TXTæ¾®¹(' + IntToStr(Indy.ResponseCode) + ')'; + end; + except + on E: EIdException do begin + if( AnsiPos('304', E.Message) > 0 ) then + StatusBar.Panels[0].Text := 'SETTING.TXTXV³µ(' + IntToStr(Indy.ResponseCode) + ')' + else + StatusBar.Panels[0].Text := 'SETTING.TXTæ¾G[(' + IntToStr(Indy.ResponseCode) + ')'; + end; + end; + finally + memStream.Free; + Screen.Cursor := crDefault; + end; + ShowBoardInformation(tmpBoard, BoardInformationMemo); + end; FWork := False; + end; end; procedure TEditorForm.ShowBoardInformation(ABoard: TBoard; AMemo: TMemo); var body: TStringList; + UCType: Integer; // 0:s¾A1:ÎA-1:ñÎ begin + UCType := 0; AMemo.Clear; AMemo.Lines.Add('[SETTING.TXT]'); if ABoard.IsSETTINGTXT then begin @@ -1803,6 +1668,10 @@ begin finally body.Free; end; + if (Pos('BBS_UNICODE=pass', AMemo.Text) > 0) then + UCType := 1 + else if (Pos('BBS_UNICODE=', AMemo.Text) > 0) then + UCType := -1; end else begin ABoard.IsSETTINGTXT := false; ABoard.SETTINGTXTTime := ZERO_DATE; @@ -1813,6 +1682,24 @@ begin AMemo.Lines.Add('SETTING.TXTð澵ĢܹñB'); AMemo.Lines.Add('j [æè澵ľ³¢B'); end; + + case UCType of + -1: begin + UCInfoPanel.Caption := 'UnicodeñÎÂ'; + UCInfoPanel.Color := clRed; + UCInfoPanel.Hint := '±ÌÂÍUnicodeÅÌXÉεĢܹñB'; + end; + 0: begin + UCInfoPanel.Caption := 'UnicodeÎs¾'; + UCInfoPanel.Color := clBtnFace; + UCInfoPanel.Hint := 'Âîñð澵ľ³¢B'; + end; + 1: begin + UCInfoPanel.Caption := 'UnicodeÎÂ'; + UCInfoPanel.Color := clLime; + UCInfoPanel.Hint := '±ÌÂÍUnicodeÅÌXÉεĢܷB'; + end; + end; end; function TEditorForm.GetTitlePictureURL(body: TStringList; ABoard: TBoard): string; //BBS_TITLE_PICTURE= @@ -1843,6 +1730,10 @@ begin else GetTitlePictureAction.Enabled := FThreadItem.ParentBoard.IsSETTINGTXT; + if GetTitlePictureAction.Enabled Then begin + // ÀsÍÀss + GetTitlePictureAction.Enabled := not FWork; + end; end; procedure TEditorForm.GetTitlePictureActionExecute(Sender: TObject); @@ -1850,54 +1741,64 @@ var memStream: TMemoryStream; tmpBoard: TBoard; begin - if FWork then + if FWork then Exit; - FWork := True; - InitIdHTTP(Indy); + FWork := True; memStream := TMemoryStream.Create; try - if FThreadItem = nil then - tmpBoard := FBoard - else - tmpBoard := FThreadItem.ParentBoard; + tmpBoard := GetBoard; - Indy.Request.Referer := tmpBoard.URL; - if tmpBoard.TitlePictureURL <> '' then begin + if (tmpBoard <> nil) and (tmpBoard.TitlePictureURL <> '') then begin StatusBar.Panels[0].Text := 'Âgbvæ_E[h'; Screen.Cursor := crHourGlass; try - IdAntiFreeze.Active := True; - try - Indy.Get(tmpBoard.TitlePictureURL, memStream); - finally - IdAntiFreeze.Active := False; - end; + // URLðwèµÄÉÇÝÞ + GetWebData(tmpBoard.TitlePictureURL, tmpBoard.URL, + ZERO_DATE, memStream); if Indy.ResponseCode = 200 then begin memStream.SaveToFile(tmpBoard.GetTitlePictureFileName); ShowTitlePicture(); tmpBoard.Modified := true; end; + StatusBar.Panels[0].Text := 'Âgbvæ (' + IntToStr(Indy.ResponseCode) + ')'; except end; end; finally - Screen.Cursor := crDefault; - StatusBar.Panels[0].Text := 'Âgbvæ (' + IntToStr(Indy.ResponseCode) + ')'; memStream.Free; + FWork := False; + Screen.Cursor := crDefault; end; +end; +{ +\brief URLÌf[^ðstreamÉÇÝÞ +\param URL ÇÝÞæ +\param RefURL refererÉÝè·é +\param Modified ModifiedÉÝè·é +\param stream ÇÝñ¾f[^ÌÛ¶æ +} +procedure TEditorForm.GetWebData(const URL: string; const RefURL: string; + Modified: TDateTime; stream: TStream); +begin + InitIdHTTP(Indy); + Indy.Request.Referer := RefURL; + Indy.Request.LastModified := Modified; + + IdAntiFreeze.Active := True; + try + Indy.Get(URL, stream); + finally + IdAntiFreeze.Active := False; + end; - FWork := False; end; procedure TEditorForm.ShowTitlePicture(); var tmpBoard: TBoard; s: String; begin - if FThreadItem = nil then - tmpBoard := FBoard - else - tmpBoard := FThreadItem.ParentBoard; + tmpBoard := GetBoard; if FileExists(tmpBoard.GetTitlePictureFileName) then begin TitlePictureBrowser.Navigate(tmpBoard.GetTitlePictureFileName); @@ -1927,71 +1828,64 @@ var URL, RefURL: string; settingBody: TStringList; tmpBoard: TBoard; + memStream: TMemoryStream; begin - if FWork then - Exit; + if not FWork then begin FWork := True; - InitIdHTTP(Indy); - if FThreadItem = nil then - tmpBoard := FBoard - else - tmpBoard := FThreadItem.ParentBoard; - - if tmpBoard = nil then Exit; - - RefURL := tmpBoard.URL; - if RefURL[Length(RefURL)] <> '/' then - URL := RefURL + '/' + 'head.txt' - else - URL := RefURL + 'head.txt'; - - if FileExists(tmpBoard.GETHEADTXTFileName) then - Indy.Request.LastModified := tmpBoard.HEADTXTTime - else - Indy.Request.LastModified := ZERO_DATE; - - Indy.Request.Referer := RefURL; - Screen.Cursor := crHourGlass; - settingBody := TStringList.Create; - try - StatusBar.Panels[0].Text := '[J[(head.txt)_E[h'; - try - IdAntiFreeze.Active := True; - try - settingBody.Text := Indy.Get(URL); - finally - IdAntiFreeze.Active := False; - end; - if( Indy.ResponseCode = 200 ) then begin - settingBody.Insert(0, ''); - settingBody.Insert(1, ''); - settingBody.Insert(2, '' + tmpBoard.Title + ' '); - settingBody.Insert(3, ''); - settingBody.Add(''); - settingBody.SaveToFile(tmpBoard.GETHEADTXTFileName); - tmpBoard.HEADTXTTime := Indy.Response.LastModified; - tmpBoard.IsHEADTXT := true; - tmpBoard.Modified := true; - StatusBar.Panels[0].Text := '[J[æ¾®¹(' + IntToStr(Indy.ResponseCode) + ')'; - end; - except - on E: EIdException do begin - if( AnsiPos('304', E.Message) > 0 ) then - StatusBar.Panels[0].Text := '[J[XV³µ(' + IntToStr(Indy.ResponseCode) + ')' - else - StatusBar.Panels[0].Text := '[J[æ¾G[(' + IntToStr(Indy.ResponseCode) + ')'; - end; - end; - finally - settingBody.Free; - Screen.Cursor := crDefault; - end; - if tmpBoard.IsHEADTXT then begin + tmpBoard := GetBoard; + if (tmpBoard <> nil) then begin + + RefURL := tmpBoard.URL; + if RefURL[Length(RefURL)] <> '/' then + URL := RefURL + '/' + 'head.txt' + else + URL := RefURL + 'head.txt'; + + Screen.Cursor := crHourGlass; + memStream := TMemoryStream.Create; + try + StatusBar.Panels[0].Text := '[J[(head.txt)_E[h'; + try + GetWebData(URL, RefURL, tmpBoard.HEADTXTTime, memStream); + if( Indy.ResponseCode = 200 ) then begin + settingBody := TStringList.Create; + try + memStream.Seek(0, soFromBeginning); + settingBody.LoadFromStream(memStream); + settingBody.Insert(0, ''); + settingBody.Insert(1, ''); + settingBody.Insert(2, ' ' + tmpBoard.Title + ' '); + settingBody.Insert(3, ''); + settingBody.Add(''); + settingBody.SaveToFile(tmpBoard.GETHEADTXTFileName); + tmpBoard.HEADTXTTime := Indy.Response.LastModified; + tmpBoard.IsHEADTXT := true; + tmpBoard.Modified := true; + finally + settingBody.Free; + end; + StatusBar.Panels[0].Text := '[J[æ¾®¹(' + IntToStr(Indy.ResponseCode) + ')'; + end; + except + on E: EIdException do begin + if( AnsiPos('304', E.Message) > 0 ) then + StatusBar.Panels[0].Text := '[J[XV³µ(' + IntToStr(Indy.ResponseCode) + ')' + else + StatusBar.Panels[0].Text := '[J[æ¾G[(' + IntToStr(Indy.ResponseCode) + ')'; + end; + end; + finally + memStream.Free; + Screen.Cursor := crDefault; + end; + if tmpBoard.IsHEADTXT then begin ShowBoardHead(tmpboard, LocalEdit); - end; - + end; + end; FWork := False; + end; + end; procedure TEditorForm.CalcCapacityActionExecute(Sender: TObject); @@ -2001,10 +1895,7 @@ var begin body := GetBody; //ǤàAüsª¸êĽÁÛ¢¯ÇA{©æª©çÈ¢B - if FThreadItem = nil then - Board := FBoard - else - Board := FThreadItem.ParentBoard; + Board := GetBoard; if Board.BoardPlugIn <> nil then body := CustomStringReplace(body, #13#10, '
') @@ -2015,12 +1906,13 @@ end; procedure TEditorForm.LocalRuleClick(Sender: TObject); var - ini: TIniFile; + ini: TMemIniFile; begin - ini := TIniFile.Create(GikoSys.Setting.GetFileName); + ini := TMemIniFile.Create(GikoSys.Setting.GetFileName); try RocalRuleTab.TabVisible := LocalRule.Checked; ini.WriteBool('EditorForm', 'LocalRuleTab', RocalRuleTab.TabVisible); + ini.UpdateFile; finally ini.Free; end; @@ -2028,11 +1920,13 @@ end; procedure TEditorForm.FormDeactivate(Sender: TObject); begin - if GikoSys.Setting.GestureEnabled then begin - MouseGesture.UnHook; - //MouseGesture.SetHook( GikoForm.Handle ); - end; - + if GikoSys.Setting.GestureEnabled then begin + GikoSys.Setting.Gestures.ClearGesture; + MouseGesture.UnHook; + MouseGesture.OnGestureStart := nil; + MouseGesture.OnGestureMove := nil; + MouseGesture.OnGestureEnd := nil; + end; end; procedure TEditorForm.OnGestureStart(Sender: TObject); @@ -2061,6 +1955,7 @@ var Action: TAction; begin s := MouseGesture.GetGestureStr; + MouseGesture.Clear; Action := GikoSys.Setting.Gestures.GetGestureAction(s); if Action <> nil then Action.Execute; @@ -2069,37 +1964,39 @@ end; procedure TEditorForm.ShowBoardHead(ABoard: TBoard; AMemo: TMemo); var - wDoc, WTex, le: OLEVariant; -begin - //Ql³ - //http://www.campus.ne.jp/~ishigami/CREATION/TECHNIC/WEBAP-2.htm - WebBrowser1.Navigate(ABoard.GETHEADTXTFileName,le,le,le,le); - //^Oªx·¬ÄTXTÉڹȢBÊéÛorz - //ºÌæ¤É¿áñÆÇÝݪIíÁÄ¢é©A`FbN·ê΢¢ñ¾æB - //±êÅ¢¯Üµ½B èªÆ¤²´¢Üµ½B - while (WebBrowser1.ReadyState <> READYSTATE_COMPLETE) and - (WebBrowser1.ReadyState <> READYSTATE_INTERACTIVE) do begin - Application.ProcessMessages; - end; - wDoc := WebBrowser1.Document; - wTex := wDoc.body.createTextRange; - LocalEdit.Text := wTex.text; + range: OleVariant; +begin + //Ql³ + //http://www.campus.ne.jp/~ishigami/CREATION/TECHNIC/WEBAP-2.htm + WebBrowser1.Navigate(ABoard.GETHEADTXTFileName); + //^Oªx·¬ÄTXTÉڹȢBÊéÛorz + //ºÌæ¤É¿áñÆÇÝݪIíÁÄ¢é©A`FbN·ê΢¢ñ¾æB + //±êÅ¢¯Üµ½B èªÆ¤²´¢Üµ½B + while (WebBrowser1.ReadyState <> READYSTATE_COMPLETE) and + (WebBrowser1.ReadyState <> READYSTATE_INTERACTIVE) do begin + Application.ProcessMessages; + end; + + try + ; + range := OleVariant(WebBrowser1.Document).body.createTextRange; + LocalEdit.Text := range.text; + except + end; end; procedure TEditorForm.LocalRuleBrowseClick(Sender: TObject); var - URL: String; - ABoard: TBoard; + URL: String; + ABoard: TBoard; begin - if FThreadItem = nil then - ABoard := FBoard - else - ABoard := FThreadItem.ParentBoard; + ABoard := GetBoard; - if ABoard = nil then Exit; + if ABoard = nil + then Exit; - URL := ABoard.GETHEADTXTFileName; - GikoSys.OpenBrowser(URL, gbtAuto); + URL := ABoard.GETHEADTXTFileName; + GikoSys.OpenBrowser(URL, gbtAuto); end; procedure TEditorForm.SaveNameMailActionExecute(Sender: TObject); @@ -2108,159 +2005,815 @@ begin KotehanCheckBox.Enabled := SaveNameMailAction.Checked; end; -function TEditorForm.LFusianaGet(s: String): Boolean; +function TEditorForm.LFusianaGet(const s: String): Boolean; +const + FUSIANA = 'fusianasan'; var i: Integer; begin - i := AnsiPos('fusianasan', s); - if (i > 0) then Result := True else Result := False; + i := AnsiPos(FUSIANA, s); + Result := (i > 0); end; procedure TEditorForm.BeLogInOutEActionExecute(Sender: TObject); begin - GikoSys.Setting.BeLogin := not GikoSys.Setting.BeLogin; + GikoDM.BeLogInOutAction.Execute; end; procedure TEditorForm.BeLogInOutEActionUpdate(Sender: TObject); begin - if (GikoSys.Setting.BeUserID <> '') and (GikoSys.Setting.BeCode <> '') then begin - if (GikoSys.Setting.BeLogin) then BeLogInOutEAction.Checked := true - else BeLogInOutEAction.Checked := false; - BeLogInOutEAction.Enabled := true - end else - BeLogInOutEAction.Enabled := false; - + BeLogInOutEAction.Checked := GikoDM.BeLogInOutAction.Checked; + BeLogInOutEAction.Enabled := GikoDM.BeLogInOutAction.Enabled; end; // CookieÌæ¾ -procedure TEditorForm.GetCookie(Rawtext: String; ABoard: TBoard); +procedure TEditorForm.GetCookie(CookieMng: TIdCookieManager; ABoard: TBoard); const - COOKIE_MARK = 'Set-Cookie:'; - VAL_SPID = 'SPID='; - VAL_PON = 'PON='; - EXPIRES_MARK = 'expires='; + VAL_SPID = 'SPID'; + VAL_PON = 'PON'; + VAL_HAP = 'HAP'; var -// i: Integer; - tmp : string; - val : string; -begin + i : Integer; + Cookie : TIdCookieRFC2109; + curCookies : TStringList; +begin + // 2008.12.14 ³ðNAµÄÍ¢¯È¢ by à¶ã + curCookies := TStringList.Create; + curCookies.Delimiter := ';'; + curCookies.DelimitedText := ABoard.Cookie; + curCookies.Sort; + curCookies.Duplicates := dupIgnore; ABoard.Cookie := ''; - while (AnsiPos(COOKIE_MARK, Rawtext) > 0 ) do begin - //i := 0; - tmp := Copy(Rawtext, AnsiPos(COOKIE_MARK, Rawtext) + Length(COOKIE_MARK), Length(Rawtext)); - Delete(Rawtext, 1, AnsiPos('Set-Cookie', Rawtext)+ Length(COOKIE_MARK)); - //CookieðØèo· - val := Trim(GikoSys.GetTokenIndex(tmp, ';', 0)); - if( AnsiPos(VAL_SPID, val) > 0 ) then begin - ABoard.SPID := Copy(val, AnsiPos(VAL_SPID, val) + Length(VAL_SPID), Length(val)); - end else if( AnsiPos(VAL_PON, val) > 0 ) then begin - ABoard.PON := Copy(val, AnsiPos(VAL_PON, val) + Length(VAL_PON), Length(val)); + try + for i := 0 to CookieMng.CookieCollection.Count - 1 do begin + Cookie := CookieMng.CookieCollection.Items[i]; + if ( Cookie.CookieName = VAL_PON ) then begin + ABoard.PON := Cookie.Value; + ABoard.Expires := GMTToLocalDateTime(Cookie.Expires); + end else if ( Cookie.CookieName = VAL_SPID ) then begin + ABoard.SPID := Cookie.Value; + ABoard.Expires := GMTToLocalDateTime(Cookie.Expires); + end else if ( Cookie.CookieName = VAL_HAP ) then begin + // HAPípÌCookieªzz³êéÌÅALøúÀð`FbN·é + if CompareDateTime(GMTToLocalDateTime(Cookie.Expires) ,Now) > 0 then begin + GikoSys.SetBoukenCookie(Cookie.Value, Cookie.Domain); + // `¯ÌÌÛ¶ + GikoSys.Setting.WriteBoukenSettingFile; + end; + end else begin + if Length( curCookies.Values[ Cookie.CookieName ] ) > 0 then begin + // ù¶lÌt¯Ö¦ + curCookies[curCookies.IndexOfName(Cookie.CookieName)] := + Cookie.ClientCookie; + end else begin + // ÇÁ + curCookies.Add(Cookie.ClientCookie); + end; + end; + end; + for i := 0 to curCookies.Count - 1 do begin + if (curCookies[i] <> '') then begin + ABoard.Cookie := ABoard.Cookie + curCookies[i] + '; '; + end; + end; + finally + CookieMng.CookieCollection.Clear; + curCookies.Free; + end; +end; +//! hiddenf[^æ¾ +procedure TEditorForm.GetHiddenParameter(Rawtext: String; ABoard: TBoard); +const + INPUT_MARK = ' 0 ) do begin + tmp := Copy(Rawtext, pos + Length(INPUT_MARK), Length(tmp)); + Delete(Rawtext, 1, pos+ Length(INPUT_MARK) - 1); + pose := AnsiPos('>', tmp); + // name=xxx value=yyy ªØèo³êé + line := Copy(tmp, 1, pose - 1); + name := ''; + value := ''; + pos := AnsiPos(NAME_MARK, tmp); + if (pos > 0) then begin + name := Copy(Rawtext, pos + Length(NAME_MARK), Length(line)); + //¼p"ÅnÜÁÄ¢é© + if AnsiPos('"', name) = 1 then begin + // ¼p"ÜÅðRs[ + Delete(name, 1, 1); + pose := AnsiPos('"', name); + if (pose > 0) then begin + Delete(name, pose, Length(name)); + end else begin + pose := AnsiPos(' ', name); + if (pose > 0) then begin + Delete(name, pose, Length(name)); + end; + end; + end else begin + pose := AnsiPos(' ', name); + if (pose > 0) then begin + Delete(name, pose, Length(name)); + end; + end; + end; + lname := AnsiLowerCase(name); + for i := 0 to Length(IGNORE_NAMES) do begin + if lname = IGNORE_NAMES[i] then begin + name := ''; + break; + end; + end; + pos := AnsiPos(VALUE_MARK, tmp); + if (name <> '') and (pos > 0) then begin + value := Copy(Rawtext, pos + Length(VALUE_MARK), Length(line)); + //¼p"ÅnÜÁÄ¢é© + if AnsiPos('"', value) = 1 then begin + // ¼p"ÜÅðRs[ + Delete(value, 1, 1); + pose := AnsiPos('"', value); + if (pose > 0) then begin + Delete(value, pose, Length(value)); + end else begin + pose := AnsiPos(' ', value); + if (pose > 0) then begin + Delete(value, pose, Length(value)); + end; + end; + end else begin + pose := AnsiPos(' ', value); + if (pose > 0) then begin + Delete(value, pose, Length(name)); + end; + end; + end; + if (name <> '') then begin + ABoard.Cookie := ABoard.Cookie + name + '=' + value + '; '; + + end; + Delete(tmp, 1, Length(line)); + Delete(Rawtext, 1, Length(line)); + pos := AnsiPos(INPUT_MARK, tmp); + end; +end; + +//! ToXVÌANVÌUpdateCxg@ÈP̽ß^C}[Ư¶ÉµÄ¨ +procedure TEditorForm.UpdateSambaActionUpdate(Sender: TObject); +begin + UpdateSambaAction.Enabled := FSambaTimer.Enabled; +end; + +//! ToXVANV +procedure TEditorForm.UpdateSambaActionExecute(Sender: TObject); +var + input : String; + i : Integer; +begin + if InputQuery('Samba24ÝèlXV', 'Vµ¢Ýèlðü͵ľ³¢', input) then begin + input := ZenToHan(input); + if GikoSys.IsNumeric(input) then begin + FSambaTimer.UpdateSambaSetting(StrToInt(input)); + UpdateSambaStatus; + //SÄÌtH[©çASamba^C}[ðXV·é + for i := 0 to Screen.FormCount - 1 do begin + if Screen.Forms[i] is TEditorForm then begin + TEditorForm(Screen.Forms[i]).FSambaTimer.Update; + TEditorForm(Screen.Forms[i]).UpdateSambaStatus; + end; + end; end else begin - ABoard.Cookie := val + '; '; - end; - //expiresðØèo· - val := Trim(GikoSys.GetTokenIndex(tmp, ';', 1)); - if( AnsiPos(EXPIRES_MARK, val) > 0) then begin - Delete(val, 1, AnsiPos(EXPIRES_MARK, val) + Length(EXPIRES_MARK) - 1); - ABoard.Expires := GMTToLocalDateTime(val); + ShowMessage('lðü͵ľ³¢'); + UpdateSambaActionExecute(Sender); end; end; end; -//SambaÌÔðÇÝÞ -procedure TEditorForm.ReadSambaTime(); +procedure TEditorForm.UpdateSambaStatus; +begin + if (FSambaTimer.Enabled) then begin + StatusBar.Panels[2].Text + := 'Samba24Kèl' + IntToStr(FSambaTimer.SambaInterval); + end; +end; + +procedure TEditorForm.InputAssistActionExecute(Sender: TObject); var - ini :TMemIniFile; - skey: String; - board: TBoard; - tmp: string; + count, i : Integer; + item : TMenuItem; + point: TPoint; + Bitmap : TBitmap; + TextWidth, ItemWidth, tmpWidth, EditW, EditT: Integer; begin - Timer1.Enabled := false; //oßb\¦TimerðOffÉ·éi±êªONÌÆ«Samba24ÎôOnj - ini := TMemIniFile.Create(GikoSys.GetSambaFileName); - try - //¶ñÅÇÝæÁÄAÏ·ÖÅTDateTimeÖ - if( FThreadItem <> nil ) then - board := FThreadItem.ParentBoard - else - board := FBoard; - - if (board <> nil) then begin - //BBSIDÆzXg¼ªêvµÄ¢½ç BBSID@zXg¼ - if( board.BBSID = FHost ) then - skey := board.BBSID + '@' + FHost - else - skey := board.BBSID; + if FInputAssistKey = '' then Exit; + + InputAssistPopupMenu.Items.Clear; - tmp := ini.ReadString('Send', skey, DateTimeToStr(ZERO_DATE)); + if (FResistWords = nil) then begin + FResistWords := TStringList.Create; + end else begin + FResistWords.Clear; + end; - //BBSIDÌL[ª³¢ÈçFHostÉØèÖ¦ÄÝé - if (tmp = DateTimeToStr(ZERO_DATE)) then begin - tmp := ini.ReadString('Send', FHost, DateTimeToStr(ZERO_DATE)); + if (GetKeyState( VK_SHIFT ) < 0) then begin + // Vtgª³êÄ¢êÎAL[ÅnÜéJeS + count := + InputAssistDM.GetStartWithCategoryResistWords( + FInputAssistKey, FResistWords); + end else begin + // Vtgª³¢ÌÅAL[ÅnÜéL[ + count := + InputAssistDM.GetStartWithKeyResistWords( + FInputAssistKey, FResistWords); + end; + Bitmap := TBitmap.Create; + try + if (FUseUC = True) then + Bitmap.Canvas.Font.Assign(BodyEditUC.Font) + else + Bitmap.Canvas.Font.Assign(BodyEdit.Font); + // }[W5px + TextWidth := Bitmap.Canvas.TextWidth(FInputAssistKey) + 5; + ItemWidth := 0; + for i := 0 to count - 1 do begin + item := TMenuItem.Create(nil); + item.Break := mbNone; + item.Caption := FResistWords[i]; + item.Tag := i; + item.OnClick := InputAssistMenuClick; + InputAssistPopupMenu.Items.Add(item); + + tmpWidth := Bitmap.Canvas.TextWidth(Item.Caption); + if (tmpWidth > ItemWidth) then begin + ItemWidth := tmpWidth; end; - FSambaTime := ConvertDateTimeString(tmp); - end; + end; finally - ini.Free; + Bitmap.Free; + end; + + if (count > 0) then begin + if (FUseUC = True) then begin + EditW := BodyEditUC.Width; + EditT := BodyEditUC.Top; + end else begin + EditW := BodyEdit.Width; + EditT := BodyEdit.Top; + end; + GetCaretpos(point); + point.X := point.X + Self.Left + (Self.Width - EditW) div 2; + point.Y := point.Y + Self.Top + (Self.Height - Self.ClientHeight); + + if Screen.DesktopWidth > + (point.X + TextWidth + ItemWidth) then begin + InputAssistPopupMenu.Popup( + point.X + TextWidth, + point.Y + EditorPage.Top + EditorPage.TabHeight + EditT); + end else begin + InputAssistPopupMenu.Popup( + point.X - TextWidth - ItemWidth, + point.Y + EditorPage.Top + EditorPage.TabHeight + EditT); + end; end; - FNow := Now(); //»ÝÔðæ¾iTimer\¦pÅACheck·éÆ«ÍÄÑNow()ðÄÔj - Timer1.Enabled := true; //oßb\¦TimerðOnÉ·éi±êªONÌÆ«Samba24ÎôOnj end; -//SambaÉÔð«Þ -procedure TEditorForm.WriteSambaTime(ATime: TDateTime); +procedure TEditorForm.InputAssistMenuClick(Sender: TObject); var - ini :TMemIniFile; + text : String; + IMC: HIMC; + EditHandle: HWND; begin - ini := TMemIniFile.Create(GikoSys.GetSambaFileName); + if not (Sender is TMenuItem) then Exit; + + if (FResistWords <> nil) then begin + if (FUseUC = True) then + EditHandle := BodyEditUC.Handle + else + EditHandle := BodyEdit.Handle; + try + text := + TResistWord(FResistWords.Objects[TMenuItem(Sender).Tag]).GetText; + except + text := ''; + end; + IMC := ImmGetContext(EditHandle); //ReLXgæ¾ + try + ImmNotifyIME(IMC, NI_COMPOSITIONSTR, CPS_CANCEL, 0); + finally + ImmReleaseContext(EditHandle, IMC); //ReLXgðú + end; + + FResistWords.Clear; + FInputAssistKey := ''; + end; + if (FUseUC = True) then + BodyEditUC.InsertText(text) + else + InsertText(BodyEdit, text); +end; + +//! TMemoÌJ[\Êuɶñ}ü +procedure TEditorForm.InsertText(Memo: TMemo; Text: String); +var + line, sel, pos: Integer; + left, right : String; +begin + Memo.Lines.BeginUpdate; + line := SendMessage(Memo.Handle,EM_LINEFROMCHAR,-1,0); //s + sel := Memo.SelStart; + pos := sel - SendMessage(Memo.Handle, EM_LINEINDEX, -1, 0); // + if (pos > 0) then begin + left := Copy(Memo.Lines[line], 0, pos); + end else begin + left := ''; + end; + right := Copy(Memo.Lines[line], pos + 1, Length(Memo.Lines[line])); + Memo.Lines.Strings[line] := left + Text + right; + Memo.Lines.EndUpdate; + //@LbgÌÊuðXV·é + Memo.SelStart := sel + Length(text); + // LbgÌÊuÜÅXN[ + Memo.Perform(EM_SCROLLCARET, 0, 0); + +end; + +procedure TEditorForm.ApplicationEvents1Message(var Msg: tagMSG; + var Handled: Boolean); +var + wmMsg: TWMKey; + IMC: HIMC; + Len: integer; + Str: string; + EditHandle: HWND; +begin + if (Self.Active) then begin + case Msg.message of + //L[ºÌÝó¯æé + WM_KEYDOWN: + begin + // ^uªhÒWhÅCtrlL[ª³êÄ¢éÌðmF·é + if (EditorPage.ActivePageIndex = 0) + and (GetKeyState( VK_CONTROL ) < 0) then begin + wmMsg.Msg := Msg.message; + wmMsg.CharCode := Word(Msg.wParam); + wmMsg.KeyData := Msg.lParam; + if (wmMsg.CharCode = 229) and (wmMsg.KeyData = 3735553) then begin + if (FUseUC = True) then + EditHandle := BodyEditUC.Handle + else + EditHandle := BodyEdit.Handle; + IMC := ImmGetContext(EditHandle); //ReLXgæ¾ + Len := ImmGetCompositionString(IMC, GCS_COMPSTR, nil, 0); //ܸ·³ðæ¾ + if (Len > 0) then begin + SetLength(Str, Len + 1); //BufferÌðÝè + ImmGetCompositionString(IMC, GCS_COMPSTR, PChar(Str), Len + 1); //ܸ·³ðæ¾ + SetLength(Str, Len); + FInputAssistKey := Str; + InputAssistActionExecute(nil); + Handled := True; + end; + ImmReleaseContext(EditHandle, IMC); //ReLXgðú + end; + end; + end; + end; + + end; +end; + +procedure TEditorForm.ShowInputAssistFormExecute(Sender: TObject); +var + form : TInputAssistForm; +begin + form := TInputAssistForm.Create(nil); try -// ini.WriteDateTime('Send', AHost, ATime); - ini.UpdateFile; + if TopAction.Checked then begin // XeCóÔÉÝè + SetWindowPos(form.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE); + end; + form.SetUpFromEditor; + if (form.ShowModal = mrOk) then begin + if (FUseUC = True) then + BodyEditUC.InsertText(form.GetInsertText) + else + InsertText(BodyEdit, form.GetInsertText); + end; finally - ini.Free; + form.Release; end; end; -//SambaÌÝèlðÇÝÞ -function TEditorForm.ReadSettingTime(): Integer ; +//! Cookieîñí +procedure TEditorForm.ReleaseCookieActionExecute(Sender: TObject); var - ini :TMemIniFile; - skey: String; - board: TBoard; + Board : TBoard; begin - ini := TMemIniFile.Create(GikoSys.GetSambaFileName); - try - if( FThreadItem <> nil ) then - board := FThreadItem.ParentBoard - else - board := FBoard; - - if (board <> nil) then begin - //BBSIDÆzXg¼ªêvµÄ¢½ç BBSID@zXg¼ - if( board.BBSID = FHost ) then - skey := board.BBSID + '@' + FHost - else - skey := board.BBSID; + // Xbhª³¢@X§ÄÌÆ«ÍFBoardð¼Úg¤ + Board := GetBoard; - Result := ini.ReadInteger('Setting', skey, -1); - //BBSIDÌL[ª³¢ÈçFHostðg¤ - if( Result = -1 ) then - Result := ini.ReadInteger('Setting', FHost, -1); + // NbL[ÌîñðÌÄé + Board.Cookie := ''; + Board.SPID := ''; + Board.PON := ''; + // 0ɪ«ß· + Board.Expires := 0; +end; +//! Âîñæ¾UpdateCxg +procedure TEditorForm.GetSETTINGTXTActionUpdate(Sender: TObject); +begin + // ÀsÍÀss + GetSETTINGTXTAction.Enabled := not FWork; +end; +//! [J[æ¾UpdateCxg +procedure TEditorForm.GetHeadTXTActionUpdate(Sender: TObject); +begin + // ÀsÍÀss + GetSETTINGTXTAction.Enabled := not FWork; +end; - //KèlªÝè³êĢȢƫÍAt@CÉ«½·B - if Result = -1 then begin - ini.WriteInteger('Setting', FHost, 0); - ini.UpdateFile; - end; - end; - finally - ini.Free; +//! Samba^C}[Cxg +procedure TEditorForm.SambaTimer(Sender: TObject); +begin + + if FSambaTimer.WriteDeta = ZERO_DATE then + StatusBar.Panels[1].Text := '' + else begin + FNow := IncMilliSecond(FNow, 500); + StatusBar.Panels[1].Text := + Format('%8.0fboß', [SecondSpan(FNow, FSambaTimer.WriteDeta)]); end; end; -//SambaÉøÁ©©é©¸·é -function TEditorForm.CheckSambaTime(ATime: TDateTime): Boolean; +{ +\brief EBhEÌÊuÆTCYÌÝè +} +procedure TEditorForm.SetWindowRect; +var + wp: TWindowPlacement; + MonCnt: Integer; + MonOk: Boolean; + MonR: Integer; + MonB: Integer; + Right: Integer; + Bottom: Integer; +begin + //EBhEÌÊuÝè + wp.length := sizeof(wp); + wp.rcNormalPosition.Top := GikoSys.Setting.EditWindowTop; + wp.rcNormalPosition.Left := GikoSys.Setting.EditWindowLeft; + + wp.rcNormalPosition.Bottom := GikoSys.Setting.EditWindowTop + GikoSys.Setting.EditWindowHeight; + wp.rcNormalPosition.Right := GikoSys.Setting.EditWindowLeft + GikoSys.Setting.EditWindowWidth; + wp.showCmd := SW_HIDE; + SetWindowPlacement(Handle, @wp); + + if GikoSys.Setting.EditWindowMax then begin + WindowState := wsMaximized; + end; + + //EBhEªæÊOÈçæÊàÉÚ®·é + Right := Left + Width; + Bottom := Top + Height; + MonOk := False; + MonCnt := 0; + while (MonCnt < Screen.MonitorCount) do begin + MonR := Screen.Monitors[MonCnt].Left + Screen.Monitors[MonCnt].Width; + MonB := Screen.Monitors[MonCnt].Top + Screen.Monitors[MonCnt].Height; + + if ((Left >= Screen.Monitors[MonCnt].Left) and (Left < MonR) and + (Top >= Screen.Monitors[MonCnt].Top) and (Top < MonB) and + (Right > Screen.Monitors[MonCnt].Left) and (Right <= MonR) and + (Bottom > Screen.Monitors[MonCnt].Top) and (Bottom <= MonB)) then begin + MonOk := True; + Break; + end; + + MonCnt := MonCnt + 1; + end; + + if (MonOk = False) then begin + Left := 0; + Top := 0; + end; + + //»ÝÌEBhEÌÊuðÛ¶ + GikoSys.Setting.EditWindowTop := Top + WINDOWMOVE_V; // ÉJEBhEÍ + GikoSys.Setting.EditWindowLeft := Left + WINDOWMOVE_H; // @@@EÎßºÉ¸ç· + //EBhEÌƳª¬³·¬¢êγÉß· + if GikoSys.Setting.EditWindowHeight < 144 then begin + Height := 400; + end; + if GikoSys.Setting.EditWindowWidth < 144 then begin + Width := 640; + end; +end; +{ +\brief g£^uÝè +} +procedure TEditorForm.SetExtraTab; +const + SECTION = 'EditorForm'; +var + ini: TMemIniFile; +begin + ini := TMemIniFile.Create(GikoSys.Setting.GetFileName); + try + BoardtopTab.TabVisible := ini.Readbool(SECTION, 'BoardTopTab', False); + BoardTop.Checked := BoardtopTab.TabVisible; + RocalRuleTab.TabVisible := ini.ReadBool(SECTION, 'LocalRuleTab', False); + LocalRule.Checked := RocalRuleTab.TabVisible; + finally + ini.Free; + end; +end; +{ +\brief Âæ¾ +\return XGfB^ªeµæ¤ÆµÄ¢é +} +function TEditorForm.GetBoard : TBoard; +begin + // XbhACeªnullÌÍFBoard + if FThreadItem = nil then begin + Result := FBoard; + end else begin + Result := FThreadItem.ParentBoard; + end; +end; +{ +\brief GikoFormÉbZ[WðÇÁ·é +\param icon bZ[WÉÂACR +} +procedure TEditorForm.AddFormMessageNew(icon: TGikoMessageIcon); +begin + if FThreadItem = nil then begin + GikoForm.AddMessageList(FBoard.Title + ' ' + GikoSys.GetGikoMessage(gmNewSure), nil, icon) + end else begin + GikoForm.AddMessageList(FThreadItem.Title + ' ' + GikoSys.GetGikoMessage(gmNewRes), nil, icon); + end; + +end; +{ +\brief [Jfusianagbv +\return true:M~ false:M +} +function TEditorForm.isLocalFusianaTrap: Boolean; +var + Namae : string; +begin + Result := False; + if GikoSys.Setting.LocalTrapAtt then begin + Namae := THTMLCreate.RepHtml(NameComboBox.Text); + if (LFusianaGet(Namae)) or (Namae = 'RèÂ') then begin + if FusianaMsgBox = IDNO then begin + Result := True; + end; + end; + end; +end; +{ +\brief [gfusianagbv +\return true:M~ false:M +} +function TEditorForm.isRemoteFusianaTrap: Boolean; +var + Namae : string; + Board : TBoard; + Remote: string; + body : TStringList; +begin + Result := False; + Namae := THTMLCreate.RepHtml(NameComboBox.Text); + if (GikoSys.Setting.RemoteTrapAtt) and (Length(Namae) = 0) then begin + Board := GetBoard; + + if Board = nil then Exit; + + if not FileExists(Board.GetSETTINGTXTFileName) then begin + //Setting.txtªÈ©Á½çæ¾ + //IÉת©©è»¤... + try + GetSETTINGTXTAction.Execute; + except + end; + end; + + Remote := ''; + if FileExists(Board.GetSETTINGTXTFileName) then begin + body := TStringList.Create; + try + body.LoadFromFile(Board.GetSETTINGTXTFileName); + Remote := GetFusianaName(body, Board); + finally + body.Free; + end; + end; + + if LFusianaGet(Remote) then begin + if FusianaMsgBox = IDNO then begin + Result := True; + end; + end; + end; +end; +{ +\brief Header¶ñæ¾ +\param ACOOKIE Cookie +\param SPID SPID +\param PON PON +\param HAP HAP +\param Board  +\return Header¶ñ +} +function TEditorForm.getHeaderStr(const ACOOKIE: string; const SPID : string; + const PON : string; const HAP : string; Board : TBoard) : string; +begin + Result := ACOOKIE; + + if SPID <> '' then + Result := Result + 'SPID=' + SPID + '; '; + if PON <> '' then + Result := Result + 'PON=' + PON + '; '; + + //zXgª2chÅABeÉLoginµÄ¢êÎBEÌf[^ðé + //GikoSys.ParseURI( URL, Protocol,Host, Path, Document, Port, Bookmark ); + //if GikoSys.Is2chHost(Host) and GikoSys.Setting.BeLogin then + if (Board.Is2ch) then begin + // ÅèÌNbL[ª êÎHí¹é + if Length(GikoSys.Setting.FixedCookie) > 0 then begin + // zXgª2chÌêCÅèÌNbL[ðHí¹é + Result := Result + GikoSys.Setting.FixedCookie + '; '; + end; + if (GikoSys.Belib.Connected) then begin + Result := Result + 'MDMD=' + GikoSys.Belib.MDMD + '; ' + + 'DMDM=' + GikoSys.Belib.DMDM + '; '; + end; + end; + + Result := 'Cookie: ' + Result + 'NAME=' + NameComboBox.Text + '; MAIL=' + MailComboBox.Text; + + if HAP <> '' then + Result := Result + '; HAP=' + HAP + '; '; + +end; + +{ +\brief fusianax_CAO +\return IDYES «Þ IDNO ~ +} +function TEditorForm.FusianaMsgBox: Integer; +const + MSG_FUSIANA : string = '[gzXgð\¦·é@\ªgíêĢܷ'#13#10 + + 'àµàÔáÁıÌû@ÅzXgª\¦³ê½ÆµÄàA©ÈÓCÈÌÅíËÉͶܹñB' + + #13#10#13#10'ÓCð¤±Æð³øµÄ«ÝÜ·©H'; +begin + Result := MsgBox(Handle, MSG_FUSIANA, 'îñ', + MB_YESNO or MB_ICONQUESTION); +end; +{ +\brief A[hON/OFFØèÖ¦ +} +procedure TEditorForm.ContinueModeActionExecute(Sender: TObject); begin + ContinueModeAction.Checked := not ContinueModeAction.Checked; end; -//SambaÌÝèlð«Þ -procedure TEditorForm.SetSamba24(); +{ +\brief A[hXV +} +procedure TEditorForm.ContinueModeActionUpdate(Sender: TObject); +begin + // X½ÄÌƫͳø + ContinueModeAction.Enabled := FThreadItem <> nil; +end; +{ +\brief «ÞÂ/Xbhð\¦·é +} +procedure TEditorForm.OpenSendTargetActionExecute(Sender: TObject); +begin + if (FThreadItem <> nil) then begin + // CðXVµÄµÜ¤ÌÅæʪp^p^ØèÖíéÌðh®½ßÉ + // OÊÅÅè·é + if not (fsShowing in Self.FormState) then begin + // XeCóÔÉÝè + SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE); + end; + try + // Xbh + GikoForm.InsertBrowserTab(FThreadItem, True); + finally + if not TopAction.Checked then begin // XeCóÔð + SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE); + end; + end; + Self.SetFocus; + end else begin + //  + GikoForm.SelectTreeNode( + GetBoard, True ); + end; +end; +procedure TEditorForm.ReloadTargetActionExecute(Sender: TObject); +begin + if (FThreadItem <> nil) then begin + // Xbh + // CðXVµÄµÜ¤ÌÅæʪp^p^ØèÖíéÌðh®½ßÉ + // OÊÅÅè·é(_E[hª¶·éÆØèÖíÁĵܤª «çßé) + if not (fsShowing in Self.FormState) then begin + // XeCóÔÉÝè + SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE); + end; + try + GikoForm.DownloadContent(FThreadItem); + finally + if not TopAction.Checked then begin // XeCóÔð + SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE); + end; + end; + Self.SetFocus; + end else begin + //  + GikoForm.DownloadList(GetBoard); + end; +end; +//! ë`FbN +function TEditorForm.isGobaku: Boolean; +const + MSG_GOBAKU : string = + '\¦µÄ¢é%sÆeæÌ%sªÙÈèÜ·B'#13#10 + + '±ÌÜÜ«ÝÜ·©H'; +var + ThreadItem : TThreadItem; + msg : String; + +begin + Result := False; + // IvVLø©ÂXMÅÌÝLø + if (GikoSys.Setting.UseGobakuCheck) then begin + // XM + if (FThreadItem <> nil) then begin + ThreadItem := GikoForm.GetActiveContent(False); + if (ThreadItem <> nil) then begin + if (FThreadItem <> ThreadItem) then begin + msg := Format(MSG_GOBAKU, ['Xbh', 'Xbh']); + Result := MsgBox(Handle, msg, 'îñ', MB_YESNO or MB_ICONQUESTION) = IDNO; + end; + end else begin + if GikoForm.ActiveList is TBBS then begin + if TBBS(GikoForm.ActiveList) <> FThreadItem.ParentBoard.ParentCategory.ParenTBBS then begin + msg := Format(MSG_GOBAKU, ['BBS', 'XbhÌ®·éBBS']); + Result := MsgBox(Handle, msg, 'îñ', MB_YESNO or MB_ICONQUESTION) = IDNO; + end; + end else if GikoForm.ActiveList is TCategory then begin + if TCategory(GikoForm.ActiveList).FindThreadFromURL(FThreadItem.URL) = nil then begin + msg := Format(MSG_GOBAKU, ['JeS', 'XbhÌ®·éJeS']); + Result := MsgBox(Handle, msg, 'îñ', MB_YESNO or MB_ICONQUESTION) = IDNO; + end; + end else if GikoForm.ActiveList is TBoard then begin + if TBoard(GikoForm.ActiveList) <> FThreadItem.ParentBoard then begin + msg := Format(MSG_GOBAKU, ['Â', 'XbhÌ®·éÂ']); + Result := MsgBox(Handle, msg, 'îñ', MB_YESNO or MB_ICONQUESTION) = IDNO; + end; + end; + end; + end else begin + // X½Ä + if GikoForm.ActiveList is TBBS then begin + if TBBS(GikoForm.ActiveList) <> FBoard.ParentCategory.ParenTBBS then begin + msg := Format(MSG_GOBAKU, ['BBS', 'ÂÌ®·éBBS']); + Result := MsgBox(Handle, msg, 'îñ', MB_YESNO or MB_ICONQUESTION) = IDNO; + end; + end else if GikoForm.ActiveList is TCategory then begin + if TCategory(GikoForm.ActiveList).FindBoardFromURL(FBoard.URL) = nil then begin + msg := Format(MSG_GOBAKU, ['JeS', 'ÂÌ®·éJeS']); + Result := MsgBox(Handle, msg, 'îñ', MB_YESNO or MB_ICONQUESTION) = IDNO; + end; + end else if GikoForm.ActiveList is TBoard then begin + if TBoard(GikoForm.ActiveList) <> FBoard then begin + msg := Format(MSG_GOBAKU, ['Â', 'Â']); + Result := MsgBox(Handle, msg, 'îñ', MB_YESNO or MB_ICONQUESTION) = IDNO; + end; + end; + end; + end; +end; + +procedure TEditorForm.SetFocusEdit; +begin + if (FUseUC = True) then + BodyEditUC.SetFocus + else + BodyEdit.SetFocus; +end; + +procedure TEditorForm.SetTextEdit(TextSrc: String); begin + if (FUseUC = True) then + BodyEditUC.Text := TextSrc + else + BodyEdit.Text := TextSrc; end; end.